#pragma once
#include "Channel.hpp"
#include "Task.hpp"

class process_pool
{
public:
    process_pool()
    :_process_count(0)
    {}

    //创建多条信道(子进程)
    void init(int process_count, const vector<task_func> tasks)
    {
        for(int i = 0; i < tasks.size(); ++i)
        {
            cout << "添加任务" << i << endl;
            _cl.add_task(tasks[i]);
        }

        _process_count = process_count;

        for(int i = 0; i < _process_count; ++i)//只有父进程会走循环语句, 子进程跑完任务就exit了
        {
            _cl.insert();
        }
    }

    int add_task(task_func func)//向进程池中添加任务
    {
        return _cl.add_task(func);
    }

    void run()
    {
        int times = 1;
        while(times--)
        {
            //1.选择一个任务 -- 父写
            cout << "请输入一个任务码: ";
            int task_code = 0;
            cin >> task_code;

            //2.[负载均衡的]选择一个信道(子进程)
            channel c = _cl.select();

            //3.派发任务 -- 子读
            c.send(task_code);

            sleep(1);
        }
    }

    void quit()
    {
        //关闭父进程的所有文件描述符wfd + 回收所有子进程
        //while(_process_count--)
        //{
            _cl.erase();        
        //}
    }



private:
    channel_list _cl;
    int _process_count;//子进程个数
};